package com.constellio.app.ui.framework.components.fields.date;
import java.util.Date;
import com.constellio.app.ui.util.DateFormatUtils;
import com.google.common.base.CharMatcher;
import com.vaadin.data.Property;
import com.vaadin.data.util.converter.Converter.ConversionException;
import com.vaadin.ui.DateField;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
public class BaseDateField extends DateField {
private static final String DATE_WITHOUT_SEPARATOR_PATTERN = "\\d{8}";
private static final String SEPARATOR_PATTERN = "[ ./-]";
public BaseDateField() {
super();
init();
}
public BaseDateField(Property<?> dataSource)
throws IllegalArgumentException {
super(dataSource);
init();
}
public BaseDateField(String caption, Date value) {
super(caption, value);
init();
}
public BaseDateField(String caption, Property<?> dataSource) {
super(caption, dataSource);
init();
}
public BaseDateField(String caption) {
super(caption);
init();
}
private void init() {
setDateFormat(DateFormatUtils.getDateFormat());
}
@Override
protected Date handleUnparsableDateString(String dateString)
throws ConversionException {
return handleUnparsableDateString(dateString, DateFormatUtils.getDateFormat());
}
static Date handleUnparsableDateString(final String dateString, final String dateFormat) {
final CharMatcher separatorCharMatcher = CharMatcher.anyOf(SEPARATOR_PATTERN).precomputed();
if (dateString.matches(DATE_WITHOUT_SEPARATOR_PATTERN)) {
final String dateFormatWithoutSeparator = separatorCharMatcher.removeFrom(dateFormat);
return parseBidirectionallyDateString(dateString, dateFormatWithoutSeparator);
} else {
final String dateFormatSeparator = String.valueOf(separatorCharMatcher.retainFrom(dateFormat).charAt(1));
final String dateStringWithDateFormatSeparator = dateString.replaceAll(SEPARATOR_PATTERN, dateFormatSeparator);
return parseBidirectionallyDateString(dateStringWithDateFormatSeparator, dateFormat);
}
}
private static Date parseBidirectionallyDateString(final String dateString, final String dateFormat) {
try {
return LocalDate.parse(dateString, DateTimeFormat.forPattern(dateFormat)).toDate();
} catch (final IllegalArgumentException e1) {
try {
final String reversedDateFormat= new StringBuilder(dateFormat).reverse().toString();
return LocalDate.parse(dateString, DateTimeFormat.forPattern(reversedDateFormat)).toDate();
} catch (final IllegalArgumentException e2) {
throw new ConversionException(e2.getLocalizedMessage());
}
}
}
}